锁
线程死锁了解吗?
死锁发生在多个线程相互等待对方释放锁时。比如说线程 1 持有锁 R1,等待锁 R2;线程 2 持有锁 R2,等待锁 R1。
互斥条件:资源同一时间只能被一个进程使用。
请求与保持: 进程已经持有资源,又去请求别的资源,且不释放已占有的。
不可抢占:资源只能由持有它的进程主动释放,不能被强行抢走。
循环等待:进程之间形成一个环形等待链:A 等 B,B 等 C,C 等 A。
该如何避免死锁
第一,所有线程都按照固定的顺序来申请资源。例如,先申请 R1 再申请 R2。
第二,如果线程发现无法获取某个资源,可以先释放已经持有的资源,重新尝试申请。
CAS了解多少
CAS 是一种乐观锁,用于比较一个变量的当前值是否等于预期值,如果相等,则更新值,否则重试。
在 CAS 中,有三个值:
- V:要更新的变量(var)
- E:预期值(expected)
- N:新值(new)
先判断 V 是否等于 E,如果等于,将 V 的值设置为 N;
如果不等,说明已经有其它线程更新了 V,当前线程就放弃更新
但是存在ABA问题,一个值原来是 A,后来被改为 B,再后来又被改回 A,这时 CAS 会误认为这个值没有发生变化
一般可以再维护一个版本号来解决问题,不仅比较更新的值,还需要比较版本号
CAS 失败时会不断自旋重试,如果一直不成功,会给 CPU 带来非常大的执行开销。,还可以增加一个自旋次数的限制